me.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2016 Google, Inc
  4. *
  5. * Based on code from coreboot src/soc/intel/broadwell/me_status.c
  6. */
  7. #include <common.h>
  8. #include <errno.h>
  9. #include <asm/arch/me.h>
  10. static inline void me_read_dword_ptr(struct udevice *dev, void *ptr, int offset)
  11. {
  12. u32 dword;
  13. dm_pci_read_config32(dev, offset, &dword);
  14. memcpy(ptr, &dword, sizeof(dword));
  15. }
  16. int intel_me_hsio_version(struct udevice *dev, uint16_t *versionp,
  17. uint16_t *checksump)
  18. {
  19. int count;
  20. u32 hsiover;
  21. struct me_hfs hfs;
  22. /* Query for HSIO version, overloads H_GS and HFS */
  23. dm_pci_write_config32(dev, PCI_ME_H_GS,
  24. ME_HSIO_MESSAGE | ME_HSIO_CMD_GETHSIOVER);
  25. /* Must wait for ME acknowledgement */
  26. for (count = ME_RETRY; count > 0; --count) {
  27. me_read_dword_ptr(dev, &hfs, PCI_ME_HFS);
  28. if (hfs.bios_msg_ack)
  29. break;
  30. udelay(ME_DELAY);
  31. }
  32. if (!count) {
  33. debug("ERROR: ME failed to respond\n");
  34. return -ETIMEDOUT;
  35. }
  36. /* HSIO version should be in HFS_5 */
  37. dm_pci_read_config32(dev, PCI_ME_HFS5, &hsiover);
  38. *versionp = hsiover >> 16;
  39. *checksump = hsiover & 0xffff;
  40. debug("ME: HSIO Version : %d (CRC 0x%04x)\n",
  41. *versionp, *checksump);
  42. /* Reset registers to normal behavior */
  43. dm_pci_write_config32(dev, PCI_ME_H_GS,
  44. ME_HSIO_MESSAGE | ME_HSIO_CMD_GETHSIOVER);
  45. return 0;
  46. }