Commit 0b3b90a0 authored by Helge Deller's avatar Helge Deller
Browse files

parisc: Add PDC PAT call to get free running 64-bit counter



PDC PAT defines this optional function. Testing on my C8000 workstation
and a rp3440 server did not indicate that they provide such counter.
Nevertheless, add the function since we should try to use such a
counter if it's available. In Qemu it should be simple to add it.

Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 5ff78421
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@
#define PDC_PAT_PD		74L         /* Protection Domain Info   */
#define PDC_PAT_PD_GET_ADDR_MAP		0L  /* Get Address Map          */
#define PDC_PAT_PD_GET_PDC_INTERF_REV	1L  /* Get PDC Interface Revisions */
#define PDC_PAT_PD_GET_PLATFORM_COUNTER	10L /* Get 64-bit free running counter */

#define PDC_PAT_CAPABILITY_BIT_PDC_SERIALIZE	(1UL << 0)
#define PDC_PAT_CAPABILITY_BIT_PDC_POLLING	(1UL << 1)
@@ -373,6 +374,8 @@ extern int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr,
		unsigned long count, unsigned long offset);
extern int pdc_pat_pd_get_pdc_revisions(unsigned long *legacy_rev,
		unsigned long *pat_rev, unsigned long *pdc_cap);
extern int pdc_pat_pd_get_platform_counter(uint64_t **addr,
		unsigned long *freq, unsigned long *uniq);

extern int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *val);
extern int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val);
+26 −1
Original line number Diff line number Diff line
@@ -1643,6 +1643,31 @@ int pdc_pat_pd_get_pdc_revisions(unsigned long *legacy_rev,
	return retval;
}

/**
 * pdc_pat_pd_get_platform_counter - Retrieve address of free-running 64-bit counter.
 * @addr: The address of the 64-bit counter.
 * @freq: The frequency of the counter, or -1 if unknown.
 * @unique: Although monotonic growing, may it return the same number twice?
 *
 */
int pdc_pat_pd_get_platform_counter(uint64_t **addr,
		unsigned long *freq, unsigned long *unique)
{
	int retval;
	unsigned long flags;

	spin_lock_irqsave(&pdc_lock, flags);
	retval = mem_pdc_call(PDC_PAT_PD, PDC_PAT_PD_GET_PLATFORM_COUNTER,
				__pa(pdc_result));
	if (retval == PDC_OK) {
		*addr = (uint64_t *)pdc_result[0];
		*freq = pdc_result[1];
		*unique = pdc_result[2];
	}
	spin_unlock_irqrestore(&pdc_lock, flags);

	return retval;
}

/**
 * pdc_pat_io_pci_cfg_read - Read PCI configuration space.