coresight: etm4x: adding range filter configuration function

Introducing a new function to do address range configuration
generic enough to work for any address range and any comparator.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Mathieu Poirier 2016-08-25 15:19:15 -06:00 committed by Greg Kroah-Hartman
parent 5edd944b43
commit 6cccf66354
1 changed files with 38 additions and 18 deletions

View File

@ -581,16 +581,10 @@ static void etm4_set_default_config(struct etmv4_config *config)
config->vinst_ctrl |= BIT(0); config->vinst_ctrl |= BIT(0);
} }
static void etm4_set_default_filter(struct etmv4_config *config) static void etm4_set_comparator_filter(struct etmv4_config *config,
u64 start, u64 stop, int comparator)
{ {
u64 start, stop, access_type = 0; u64 access_type = 0;
/*
* Configure address range comparator '0' to encompass all
* possible addresses.
*/
start = 0x0;
stop = ~0x0;
/* EXLEVEL_NS, bits[12:15], always stay away from hypervisor mode. */ /* EXLEVEL_NS, bits[12:15], always stay away from hypervisor mode. */
access_type = ETM_EXLEVEL_NS_HYP; access_type = ETM_EXLEVEL_NS_HYP;
@ -604,20 +598,46 @@ static void etm4_set_default_filter(struct etmv4_config *config)
ETM_EXLEVEL_S_HYP); ETM_EXLEVEL_S_HYP);
/* First half of default address comparator */ /* First half of default address comparator */
config->addr_val[ETM_DEFAULT_ADDR_COMP] = start; config->addr_val[comparator] = start;
config->addr_acc[ETM_DEFAULT_ADDR_COMP] = access_type; config->addr_acc[comparator] = access_type;
config->addr_type[ETM_DEFAULT_ADDR_COMP] = ETM_ADDR_TYPE_RANGE; config->addr_type[comparator] = ETM_ADDR_TYPE_RANGE;
/* Second half of default address comparator */ /* Second half of default address comparator */
config->addr_val[ETM_DEFAULT_ADDR_COMP + 1] = stop; config->addr_val[comparator + 1] = stop;
config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = access_type; config->addr_acc[comparator + 1] = access_type;
config->addr_type[ETM_DEFAULT_ADDR_COMP + 1] = ETM_ADDR_TYPE_RANGE; config->addr_type[comparator + 1] = ETM_ADDR_TYPE_RANGE;
/* /*
* Configure the ViewInst function to filter on address range * Configure the ViewInst function to include this address range
* comparator '0'. * comparator.
*
* @comparator is divided by two since it is the index in the
* etmv4_config::addr_val array but register TRCVIIECTLR deals with
* address range comparator _pairs_.
*
* Therefore:
* index 0 -> compatator pair 0
* index 2 -> comparator pair 1
* index 4 -> comparator pair 2
* ...
* index 14 -> comparator pair 7
*/ */
config->viiectlr = BIT(0); config->viiectlr |= BIT(comparator / 2);
}
static void etm4_set_default_filter(struct etmv4_config *config)
{
u64 start, stop;
/*
* Configure address range comparator '0' to encompass all
* possible addresses.
*/
start = 0x0;
stop = ~0x0;
etm4_set_comparator_filter(config, start, stop,
ETM_DEFAULT_ADDR_COMP);
/* /*
* TRCVICTLR::SSSTATUS == 1, the start-stop logic is * TRCVICTLR::SSSTATUS == 1, the start-stop logic is