1 /* SPDX-License-Identifier: GPL-2.0-or-later */
6 #include "intelmetool.h"
10 static const int size
= 0x4000;
12 /* Returns the physical RCBA base address or zero on error. */
13 u32
get_rcba_phys(void)
15 struct pci_access
*pacc
;
20 pacc
->method
= PCI_ACCESS_I386_TYPE1
;
25 sb
= pci_get_dev(pacc
, 0, 0, 0x1f, 0);
27 printf("Uh oh, southbridge not on BDF(0:31:0), please report "
28 "this error, exiting.\n");
32 pci_fill_info(sb
, PCI_FILL_IDENT
| PCI_FILL_BASES
| PCI_FILL_SIZES
|
35 rcba_phys
= pci_read_long(sb
, 0xf0) & 0xfffffffe;
44 * Writes 'val' to RCBA register at address 'addr'.
45 * Returns 1 on error and 0 on success.
47 int write_rcba32(uint32_t addr
, uint32_t val
)
49 volatile uint8_t *rcba
;
50 const uint32_t rcba_phys
= get_rcba_phys();
53 printf("Could not get RCBA address\n");
57 rcba
= map_physical((off_t
)rcba_phys
, size
);
59 printf("Could not map RCBA\n"
60 "Do you have kernel cmdline argument 'iomem=relaxed' set ?\n");
63 *(uint32_t *)(rcba
+ addr
) = val
;
65 munmap((void *)rcba
, size
);
70 * Reads RCBA register at address 'addr' and stores it in 'val'.
71 * Returns 1 on error and 0 on success.
73 int read_rcba32(uint32_t addr
, uint32_t *val
)
75 volatile uint8_t *rcba
;
76 const uint32_t rcba_phys
= get_rcba_phys();
79 printf("Could not get RCBA address\n");
83 rcba
= map_physical((off_t
)rcba_phys
, size
);
85 printf("Could not map RCBA\n"
86 "Do you have kernel cmdline argument 'iomem=relaxed' set ?\n");
90 *val
= *(uint32_t *)(rcba
+ addr
);
92 munmap((void *)rcba
, size
);