A couple of upstream fixes for Raspberry Pi
This commit is contained in:
		
							parent
							
								
									df3d8e2f95
								
							
						
					
					
						commit
						daca4a8819
					
				
							
								
								
									
										206
									
								
								bcm2835-clk-audio-jitter-issues.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								bcm2835-clk-audio-jitter-issues.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,206 @@ | ||||
| From patchwork Thu Jun  1 14:14:16 2017 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v4,1/2] clk: bcm2835: Limit PCM clock to OSC and PLLD_PER | ||||
| From: Phil Elwell <phil@raspberrypi.org> | ||||
| X-Patchwork-Id: 9759641 | ||||
| Message-Id: <8cc0ba82-d33e-127b-7b86-ac595ef416d1@raspberrypi.org> | ||||
| To: Michael Turquette <mturquette@baylibre.com>, | ||||
|  Stephen Boyd <sboyd@codeaurora.org>, Eric Anholt <eric@anholt.net>, | ||||
|  Stefan Wahren <stefan.wahren@i2se.com>, | ||||
|  Florian Fainelli <f.fainelli@gmail.com>, | ||||
|  linux-clk@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, | ||||
|  linux-kernel@vger.kernel.org | ||||
| Date: Thu, 1 Jun 2017 15:14:16 +0100 | ||||
| 
 | ||||
| Restrict clock sources for the PCM peripheral to the oscillator and | ||||
| PLLD_PER because other source may have varying rates or be switched off. | ||||
| Prevent other sources from being selected by replacing their names in | ||||
| the list of potential parents with dummy entries (entry index is | ||||
| significant). | ||||
| 
 | ||||
| Signed-off-by: Phil Elwell <phil@raspberrypi.org> | ||||
| Reviewed-by: Eric Anholt <eric@anholt.net> | ||||
| Acked-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| ---
 | ||||
|  drivers/clk/bcm/clk-bcm2835.c | 27 ++++++++++++++++++++++++++- | ||||
|  1 file changed, 26 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| index 0258538..49867d2 100644
 | ||||
| --- a/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| +++ b/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| @@ -1516,6 +1516,31 @@ struct bcm2835_clk_desc {
 | ||||
|  	.parents = bcm2835_clock_per_parents,				\ | ||||
|  	__VA_ARGS__) | ||||
|   | ||||
| +/*
 | ||||
| + * Restrict clock sources for the PCM peripheral to the oscillator and
 | ||||
| + * PLLD_PER because other source may have varying rates or be switched
 | ||||
| + * off.
 | ||||
| + *
 | ||||
| + * Prevent other sources from being selected by replacing their names in
 | ||||
| + * the list of potential parents with dummy entries (entry index is
 | ||||
| + * significant).
 | ||||
| + */
 | ||||
| +static const char *const bcm2835_pcm_per_parents[] = {
 | ||||
| +	"-",
 | ||||
| +	"xosc",
 | ||||
| +	"-",
 | ||||
| +	"-",
 | ||||
| +	"-",
 | ||||
| +	"-",
 | ||||
| +	"plld_per",
 | ||||
| +	"-",
 | ||||
| +};
 | ||||
| +
 | ||||
| +#define REGISTER_PCM_CLK(...)	REGISTER_CLK(				\
 | ||||
| +	.num_mux_parents = ARRAY_SIZE(bcm2835_pcm_per_parents),		\
 | ||||
| +	.parents = bcm2835_pcm_per_parents,				\
 | ||||
| +	__VA_ARGS__)
 | ||||
| +
 | ||||
|  /* main vpu parent mux */ | ||||
|  static const char *const bcm2835_clock_vpu_parents[] = { | ||||
|  	"gnd", | ||||
| @@ -1993,7 +2018,7 @@ struct bcm2835_clk_desc {
 | ||||
|  		.int_bits = 4, | ||||
|  		.frac_bits = 8, | ||||
|  		.tcnt_mux = 22), | ||||
| -	[BCM2835_CLOCK_PCM]	= REGISTER_PER_CLK(
 | ||||
| +	[BCM2835_CLOCK_PCM]	= REGISTER_PCM_CLK(
 | ||||
|  		.name = "pcm", | ||||
|  		.ctl_reg = CM_PCMCTL, | ||||
|  		.div_reg = CM_PCMDIV, | ||||
| From patchwork Thu Jun  1 14:14:22 2017 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v4,2/2] clk: bcm2835: Minimise clock jitter for PCM clock | ||||
| From: Phil Elwell <phil@raspberrypi.org> | ||||
| X-Patchwork-Id: 9759643 | ||||
| Message-Id: <9989244b-ca4d-9081-95d9-b24f51099222@raspberrypi.org> | ||||
| To: Michael Turquette <mturquette@baylibre.com>, | ||||
|  Stephen Boyd <sboyd@codeaurora.org>, Eric Anholt <eric@anholt.net>, | ||||
|  Stefan Wahren <stefan.wahren@i2se.com>, | ||||
|  Florian Fainelli <f.fainelli@gmail.com>, | ||||
|  linux-clk@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, | ||||
|  linux-kernel@vger.kernel.org | ||||
| Date: Thu, 1 Jun 2017 15:14:22 +0100 | ||||
| 
 | ||||
| Fractional clock dividers generate accurate average frequencies but | ||||
| with jitter, particularly when the integer divisor is small. | ||||
| 
 | ||||
| Introduce a new metric of clock accuracy to penalise clocks with a good | ||||
| average but worse jitter compared to clocks with an average which is no | ||||
| better but with lower jitter. The metric is the ideal rate minus the | ||||
| worse deviation from that ideal using the nearest integer divisors. | ||||
| 
 | ||||
| Use this metric for parent selection for clocks requiring low jitter | ||||
| (currently just PCM). | ||||
| 
 | ||||
| Signed-off-by: Phil Elwell <phil@raspberrypi.org> | ||||
| Reviewed-by: Eric Anholt <eric@anholt.net> | ||||
| Acked-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| ---
 | ||||
|  drivers/clk/bcm/clk-bcm2835.c | 34 +++++++++++++++++++++++++++++----- | ||||
|  1 file changed, 29 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| index 49867d2..0bc56a0 100644
 | ||||
| --- a/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| +++ b/drivers/clk/bcm/clk-bcm2835.c
 | ||||
| @@ -530,6 +530,7 @@ struct bcm2835_clock_data {
 | ||||
|   | ||||
|  	bool is_vpu_clock; | ||||
|  	bool is_mash_clock; | ||||
| +	bool low_jitter;
 | ||||
|   | ||||
|  	u32 tcnt_mux; | ||||
|  }; | ||||
| @@ -1124,7 +1125,8 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
 | ||||
|  							int parent_idx, | ||||
|  							unsigned long rate, | ||||
|  							u32 *div, | ||||
| -							unsigned long *prate)
 | ||||
| +							unsigned long *prate,
 | ||||
| +							unsigned long *avgrate)
 | ||||
|  { | ||||
|  	struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw); | ||||
|  	struct bcm2835_cprman *cprman = clock->cprman; | ||||
| @@ -1139,8 +1141,25 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
 | ||||
|  		*prate = clk_hw_get_rate(parent); | ||||
|  		*div = bcm2835_clock_choose_div(hw, rate, *prate, true); | ||||
|   | ||||
| -		return bcm2835_clock_rate_from_divisor(clock, *prate,
 | ||||
| -						       *div);
 | ||||
| +		*avgrate = bcm2835_clock_rate_from_divisor(clock, *prate, *div);
 | ||||
| +
 | ||||
| +		if (data->low_jitter && (*div & CM_DIV_FRAC_MASK)) {
 | ||||
| +			unsigned long high, low;
 | ||||
| +			u32 int_div = *div & ~CM_DIV_FRAC_MASK;
 | ||||
| +
 | ||||
| +			high = bcm2835_clock_rate_from_divisor(clock, *prate,
 | ||||
| +							       int_div);
 | ||||
| +			int_div += CM_DIV_FRAC_MASK + 1;
 | ||||
| +			low = bcm2835_clock_rate_from_divisor(clock, *prate,
 | ||||
| +							      int_div);
 | ||||
| +
 | ||||
| +			/*
 | ||||
| +			 * Return a value which is the maximum deviation
 | ||||
| +			 * below the ideal rate, for use as a metric.
 | ||||
| +			 */
 | ||||
| +			return *avgrate - max(*avgrate - low, high - *avgrate);
 | ||||
| +		}
 | ||||
| +		return *avgrate;
 | ||||
|  	} | ||||
|   | ||||
|  	if (data->frac_bits) | ||||
| @@ -1167,6 +1186,7 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
 | ||||
|   | ||||
|  	*div = curdiv << CM_DIV_FRAC_BITS; | ||||
|  	*prate = curdiv * best_rate; | ||||
| +	*avgrate = best_rate;
 | ||||
|   | ||||
|  	return best_rate; | ||||
|  } | ||||
| @@ -1178,6 +1198,7 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
 | ||||
|  	bool current_parent_is_pllc; | ||||
|  	unsigned long rate, best_rate = 0; | ||||
|  	unsigned long prate, best_prate = 0; | ||||
| +	unsigned long avgrate, best_avgrate = 0;
 | ||||
|  	size_t i; | ||||
|  	u32 div; | ||||
|   | ||||
| @@ -1202,11 +1223,13 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
 | ||||
|  			continue; | ||||
|   | ||||
|  		rate = bcm2835_clock_choose_div_and_prate(hw, i, req->rate, | ||||
| -							  &div, &prate);
 | ||||
| +							  &div, &prate,
 | ||||
| +							  &avgrate);
 | ||||
|  		if (rate > best_rate && rate <= req->rate) { | ||||
|  			best_parent = parent; | ||||
|  			best_prate = prate; | ||||
|  			best_rate = rate; | ||||
| +			best_avgrate = avgrate;
 | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| @@ -1216,7 +1239,7 @@ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
 | ||||
|  	req->best_parent_hw = best_parent; | ||||
|  	req->best_parent_rate = best_prate; | ||||
|   | ||||
| -	req->rate = best_rate;
 | ||||
| +	req->rate = best_avgrate;
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -2025,6 +2048,7 @@ struct bcm2835_clk_desc {
 | ||||
|  		.int_bits = 12, | ||||
|  		.frac_bits = 12, | ||||
|  		.is_mash_clock = true, | ||||
| +		.low_jitter = true,
 | ||||
|  		.tcnt_mux = 23), | ||||
|  	[BCM2835_CLOCK_PWM]	= REGISTER_PER_CLK( | ||||
|  		.name = "pwm", | ||||
							
								
								
									
										70
									
								
								bcm2835-fix-potential-null-pointer-dereferences.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								bcm2835-fix-potential-null-pointer-dereferences.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| From patchwork Thu May 25 17:04:55 2017 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: [v2] mmc: bcm2835: fix potential null pointer dereferences | ||||
| From: "Gustavo A. R. Silva" <garsilva@embeddedor.com> | ||||
| X-Patchwork-Id: 9748761 | ||||
| Message-Id: <20170525170455.GA6904@embeddedgus> | ||||
| To: Stefan Wahren <stefan.wahren@i2se.com>, | ||||
|  Ulf Hansson <ulf.hansson@linaro.org>, | ||||
|  Florian Fainelli <f.fainelli@gmail.com>, | ||||
|  Ray Jui <rjui@broadcom.com>, Scott Branden <sbranden@broadcom.com>, | ||||
|  bcm-kernel-feedback-list@broadcom.com, Eric Anholt <eric@anholt.net> | ||||
| Cc: "Gustavo A. R. Silva" <garsilva@embeddedor.com>, | ||||
|  linux-mmc@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, | ||||
|  linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org | ||||
| Date: Thu, 25 May 2017 12:04:55 -0500 | ||||
| 
 | ||||
| Null check at line 1165: if (mrq->cmd), implies that mrq->cmd might | ||||
| be NULL. | ||||
| Add null checks before dereferencing pointer mrq->cmd in order to avoid | ||||
| any potential NULL pointer dereference. | ||||
| 
 | ||||
| Addresses-Coverity-ID: 1408740 | ||||
| Tested-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Signed-off-by: Gustavo A. R. Silva <garsilva@embeddedor.com> | ||||
| ---
 | ||||
| Changes in v2: | ||||
|  Change subject to make it clear the patch is bcm2835 related. | ||||
| 
 | ||||
|  drivers/mmc/host/bcm2835.c | 12 +++++++++--- | ||||
|  1 file changed, 9 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| diff --git a/drivers/mmc/host/bcm2835.c b/drivers/mmc/host/bcm2835.c
 | ||||
| index 1f343a4..abba9a2 100644
 | ||||
| --- a/drivers/mmc/host/bcm2835.c
 | ||||
| +++ b/drivers/mmc/host/bcm2835.c
 | ||||
| @@ -1172,7 +1172,10 @@ static void bcm2835_request(struct mmc_host *mmc, struct mmc_request *mrq)
 | ||||
|  	if (mrq->data && !is_power_of_2(mrq->data->blksz)) { | ||||
|  		dev_err(dev, "unsupported block size (%d bytes)\n", | ||||
|  			mrq->data->blksz); | ||||
| -		mrq->cmd->error = -EINVAL;
 | ||||
| +
 | ||||
| +		if (mrq->cmd)
 | ||||
| +			mrq->cmd->error = -EINVAL;
 | ||||
| +
 | ||||
|  		mmc_request_done(mmc, mrq); | ||||
|  		return; | ||||
|  	} | ||||
| @@ -1194,7 +1197,10 @@ static void bcm2835_request(struct mmc_host *mmc, struct mmc_request *mrq)
 | ||||
|  			readl(host->ioaddr + SDCMD) & SDCMD_CMD_MASK, | ||||
|  			edm); | ||||
|  		bcm2835_dumpregs(host); | ||||
| -		mrq->cmd->error = -EILSEQ;
 | ||||
| +
 | ||||
| +		if (mrq->cmd)
 | ||||
| +			mrq->cmd->error = -EILSEQ;
 | ||||
| +
 | ||||
|  		bcm2835_finish_request(host); | ||||
|  		mutex_unlock(&host->mutex); | ||||
|  		return; | ||||
| @@ -1207,7 +1213,7 @@ static void bcm2835_request(struct mmc_host *mmc, struct mmc_request *mrq)
 | ||||
|  			if (!host->use_busy) | ||||
|  				bcm2835_finish_command(host); | ||||
|  		} | ||||
| -	} else if (bcm2835_send_command(host, mrq->cmd)) {
 | ||||
| +	} else if (mrq->cmd && bcm2835_send_command(host, mrq->cmd)) {
 | ||||
|  		if (host->data && host->dma_desc) { | ||||
|  			/* DMA transfer starts now, PIO starts after irq */ | ||||
|  			bcm2835_start_dma(host); | ||||
| @ -604,6 +604,9 @@ Patch311: arm-imx6-hummingboard2.patch | ||||
| 
 | ||||
| Patch312: arm64-Add-option-of-13-for-FORCE_MAX_ZONEORDER.patch | ||||
| 
 | ||||
| Patch313: bcm2835-clk-audio-jitter-issues.patch | ||||
| Patch314: bcm2835-fix-potential-null-pointer-dereferences.patch | ||||
| 
 | ||||
| # 400 - IBM (ppc/s390x) patches | ||||
| 
 | ||||
| # 500 - Temp fixes/CVEs etc | ||||
| @ -2164,6 +2167,9 @@ fi | ||||
| # | ||||
| # | ||||
| %changelog | ||||
| * Wed Jun  7 2017 Peter Robinson <pbrobinson@fedoraproject.org> | ||||
| - A couple of upstream fixes for Raspberry Pi | ||||
| 
 | ||||
| * Tue Jun 06 2017 Laura Abbott <labbott@redhat.com> | ||||
| - Enable the vDSO for arm LPAE | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user